package com.iwjw.ibatis.mapper;

import com.iwjw.ibatis.annotations.MasterMark;
import com.iwjw.ibatis.criteria.Query;
import com.iwjw.ibatis.entity.Page;
import org.apache.ibatis.annotations.Param;

import java.io.Serializable;
import java.util.List;

/**
 * 通用操作类
 *
 * @author weiwei.huang
 * @Time 2016/10/19
 */
public interface BaseMapper<T, PK extends Serializable> {

    /**
     * 插入单条记录
     *
     * @param entity
     * @return
     */
    int insert(T entity);


    /**
     * 批量插入
     *
     * @param entity
     * @return
     */
    int batchInsert(List<T> entity);

    /**
     * 插入单条记录（非null）
     *
     * @param entity
     * @return
     */
    int insertSelective(T entity);

    /**
     * 通过主键批量删除
     *
     * @param id
     * @return
     */
    int deleteByPrimaryKey(PK id);

    /**
     * 通过主键集合批量删除
     *
     * @param ids
     * @return
     */
    int deleteByPrimaryKeys(List<PK> ids);

    /**
     * 通过查询条件删除
     *
     * @param example
     * @return
     */
    int deleteByQuery(Query example);

    /**
     * 通过主键更新记录（注:如果model开启了乐观锁，则该方案默认启动乐观更新策略）
     *
     * @param record
     * @return
     */
    int updateByPrimaryKey(T record);

    /**
     * 通过主键更新记录（跳过model开启的乐观锁）
     *
     * @param record
     * @return
     */
    int updateByPrimaryKeyNoOptimistic(T record);

    /**
     * 通过主键更新记录（非null字段，注:如果model开启了乐观锁，则该方案默认启动乐观更新策略）
     *
     * @param record
     * @return
     */
    int updateByPrimaryKeySelective(T record);

    /**
     * 通过主键更新记录（跳过model开启的乐观锁）
     *
     * @param record
     * @return
     */
    int updateByPrimaryKeySelectiveNoOptimistic(T record);

    /**
     * 通过查询语句更新
     *
     * @param record
     * @param query
     * @return
     */
    int updateByQuery(@Param(ISqlInjector.ENTITY) T record, @Param(ISqlInjector.QUERY_ENTITY) Query query);

    /**
     * 通过查询条件更新（非null）
     *
     * @param record
     * @param query
     * @return
     */
    int updateByQuerySelective(@Param(ISqlInjector.ENTITY) T record, @Param(ISqlInjector.QUERY_ENTITY) Query query);

    /**
     * 通过主键id查询
     *
     * @param id
     * @return
     */
    T selectByPrimaryKey(@Param(ISqlInjector.PRIMARY_KEY) PK id, @Param(ISqlInjector.MASTER_MARK) MasterMark... masterMarks);


    /**
     * 通过主键id查询
     *
     * @param id
     * @return
     */
    T selectByPrimaryKeySpecifiedColumn(@Param(ISqlInjector.PRIMARY_KEY) PK id, @Param(ISqlInjector.RETURN_FIELDS_KEY) String[] fields, @Param(ISqlInjector.MASTER_MARK) MasterMark... masterMarks);

    /**
     * 通过逐渐ids查询
     *
     * @param ids
     * @return
     */
    List<T> selectByPrimaryKeys(@Param(ISqlInjector.PRIMARY_KEYS) List<PK> ids, @Param(ISqlInjector.MASTER_MARK) MasterMark... masterMarks);


    /**
     * 通过逐渐ids查询（指定字段）
     *
     * @param ids
     * @return
     */
    List<T> selectByPrimaryKeysSpecifiedColumn(@Param(ISqlInjector.PRIMARY_KEYS) List<PK> ids, @Param(ISqlInjector.RETURN_FIELDS_KEY) String[] fields, @Param(ISqlInjector.MASTER_MARK) MasterMark... masterMarks);

    /**
     * 通过查询条件获取结果集第一条
     *
     * @param query
     * @return
     */
    T selectOneByQuery(@Param(ISqlInjector.QUERY_ENTITY) Query query, @Param(ISqlInjector.MASTER_MARK) MasterMark... masterMarks);

    /**
     * 通过查询条件获取结果集第一条（返回字段限制）
     *
     * @param query
     * @return
     */
    T selectOneByQuerySpecifiedColumn(@Param(ISqlInjector.QUERY_ENTITY) Query query, @Param(ISqlInjector.RETURN_FIELDS_KEY) String[] fields, @Param(ISqlInjector.MASTER_MARK) MasterMark... masterMarks);

    /**
     * 通过查询条件获取结果集
     *
     * @param query
     * @return
     */
    List<T> selectByQuery(@Param(ISqlInjector.QUERY_ENTITY) Query query, @Param(ISqlInjector.MASTER_MARK) MasterMark... masterMarks);


    /**
     * 通过查询条件获取结果集（返回字段限制）
     *
     * @param query
     * @return 返回指定字段的映射
     */
    List<T> selectByQuerySpecifiedColumn(@Param(ISqlInjector.QUERY_ENTITY) Query query, @Param(ISqlInjector.RETURN_FIELDS_KEY) String[] fields, @Param(ISqlInjector.MASTER_MARK) MasterMark... masterMarks);


    /**
     * @param query
     * @return
     */
    int countByQuery(@Param(ISqlInjector.QUERY_ENTITY) Query query, @Param(ISqlInjector.MASTER_MARK) MasterMark... masterMarks);


    /**
     * 分页操作
     *
     * @param query
     * @param rowBounds
     * @param masterMarks
     * @return
     */
    List<T> getPage(@Param(ISqlInjector.QUERY_ENTITY) Query query, @Param(ISqlInjector.ROW_BOUNDS) Page rowBounds, @Param(ISqlInjector.MASTER_MARK) MasterMark... masterMarks);

    /**
     * 分页操作指定返回字段
     *
     * @param query
     * @param rowBounds
     * @param fields
     * @param masterMarks
     * @return
     */
    List<T> getPageSpecifiedColumn(@Param(ISqlInjector.QUERY_ENTITY) Query query, @Param(ISqlInjector.ROW_BOUNDS) Page rowBounds, @Param(ISqlInjector.RETURN_FIELDS_KEY) String[] fields, @Param(ISqlInjector.MASTER_MARK) MasterMark... masterMarks);

}